/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: Constant.h,v 1.2 2009/04/06 14:38:03 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __Constant__
#define __Constant__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <MReference.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented constant interface.
	class API Constant : public MReference
	{
	public:		
		// constructor
		Constant();
		
		// destructor
		virtual ~Constant();

		// set the constant value
		INLINE VOID setValue( const VOID* data, U32 size );
		INLINE VOID setBool( BOOL b );
		INLINE VOID setBoolArray( const BOOL* pb, U32 count );
		INLINE VOID setInt( I32 n );
		INLINE VOID setIntArray( const I32* pn, U32 count );		
		INLINE VOID setFloat( F32 f );		
		INLINE VOID setFloatArray( const F32* pf, U32 count );		
		INLINE VOID setVector( const Vector4& vec );		
		INLINE VOID setVectorArray( const Vector4* pvec, U32 count );		
		INLINE VOID setMatrix( const Matrix& mat );		
		INLINE VOID setMatrixArray( const Matrix* pmat, U32 count );		
		INLINE VOID setString( const CHAR* string );		
		INLINE VOID setTexture( const Texture* texture );

	private:
		// the constant type
		enum ConstantType
		{
			CT_NONE,
			CT_VALUE,
			CT_BOOL,
			CT_BOOL_ARRAY,
			CT_INT,
			CT_INT_ARRAY,
			CT_FLOAT,
			CT_FLOAT_ARRAY,
			CT_VECTOR,
			CT_VECTOR_ARRAY,
			CT_MATRIX,
			CT_MATRIX_ARRAY,
			CT_STRING,
			CT_TEXTURE,			
		};

	private:
		U32 mType;
		U8 *mData; 
		U32 mCount;
		TexturePtr mTexturePtr;

	private: friend class Primitive;
	};

	typedef MPtr<Constant>ConstantPtr;

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __Constant__

//////////////////////////////////////////////////////////////////////////
